@Sophia
2年前 提问
1个回答
Scapy 怎么定制 ping 包
GQQQy
2年前
Scapy定制ping包,主要包括以下四个阶段:
- 先抑制scapy导入所出现的报错,然后导入程序中所需要的所有数据包。
from scapy.all import *
from random import randint
def ping_once(host):
#随机产生一个1-65535的IP的id位
ip_id=randint(1,65535)
#随机产生一个1-65535的icmp的id位
icmp_id=randint(1,65535)
#随机产生一个1-65535的icmp的序列号
icmp_seq=randint(1,65535)
- 使用命令铸造数据包
packet=IP(dst=host,ttl=64,id=ip_id)/ICMP(id=icmp_id,seq=icmp_seq)/b'rootkit'
- 把铸造的数据包进行发送。
ping=sr1(packet,timeout=2,verbose=False)
#如果收到回复则代表ping成功,成功就以退出码3退出(便于后续用来判断此进程是否成功)
if ping:
os._exit(3)
if __name__ == '__main__':
ping_once(sys.argv[1])
- 最后实现ping扫描
#!/usr/bin/python3.4
# _*_ coding=utf-8 _*_
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
import ipaddress
import time
import multiprocessing
from random import randint
from scapy.all import *
#实现ping扫描的函数
def ping_once(host):
ip_id=randint(1,65535)
icmp_id=randint(1,65535)
icmp_seq=randint(1,65535)
packet=IP(dst=host,ttl=64,id=ip_id)/ICMP(id=icmp_id,seq=icmp_seq)/b'rootkit'
ping=sr1(packet,timeout=2,verbose=False)
if ping:
os._exit(3)
#使用多进程连续调用ping_once函数,实现ping_scan
def ping_scan(network):
#此模块可以将一个网络转换成一个个ip地址
net=ipaddress.ip_network(network)
ip_processes={}
for ip in net:
#读取网络中的每一个IP地址,使用str将其转换成字符串
ip_addr=str(ip)
#开启多进程,使用ping_once这个函数扫描ip_addr这个地址
ping=multiprocessing.Process(target=ping_once,args=(ip_addr,))
#开启这个进程
ping.start()
#产生ip与进程对应的字典
ip_processes[ip_addr]=ping
ip_list=[]
for ip,process in ip_addresses.items():
if process.exitcode==3:
ip_list.append(ip)
else:
process.terminate()
return sorted(ip_list)
if __name__ == '__main__':
import time
t1=time.time()
active_ip=ping_scan(sys/argv[1])
print("活动IP地址如下:")
for ip in active_ip:
print(ip)
t2=time.time()
print(t2-t1)